package es.cea.core.util;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@SuppressWarnings("unchecked")
public class LectorAnotacionesImpl implements LectorAnotaciones {

	public boolean existeAnotacionEnDefinicionClase(Class claz,
			Class anotacionClass) {
		return claz.isAnnotationPresent(anotacionClass);
	}

	public Method dameMetodo(Class clase, String nombre) {
		return dameMetodo(clase, nombre, null);
	}

	public Method dameMetodo(Class clase, String nombre, Class... types) {

		Method method;
		try {
			return clase.getMethod(nombre, types);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

	public Annotation dameAnotacionEnDefinicionMetodo(Class claz,
			Method method, Class anotacionClass) throws NoExisteAnotacionException{
		if (method.isAnnotationPresent(anotacionClass))
			return method.getAnnotation(anotacionClass);
		else
			throw new NoExisteAnotacionException("no existe la anotacion de tipo: "
					+ anotacionClass.getSimpleName() + " en el metodo: "
					+ method.getName());
	}

	public Object dameValor(Class claz, Class anotacionClass,
			String nombreAtributo) {
		Annotation annotation = claz.getAnnotation(anotacionClass);
		try {
			return annotation.annotationType().getMethod(nombreAtributo)
					.invoke(annotation);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

}
